package com.smart.community.complaint.dto;

import com.smart.community.commons.base.BaseDTO;
import com.smart.community.commons.enums.SystemStatusEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.Size;
import java.time.LocalDateTime;

/**
 * 投诉建议查询数据传输对象
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-06-27
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class ComplaintQueryDTO extends BaseDTO {

    /**
     * 用户ID（可选）
     */
    private Long userId;

    /**
     * 社区ID（可选）
     */
    private Long communityId;

    /**
     * 投诉标题（模糊查询）
     */
    @Size(max = 200, message = "投诉标题长度不能超过200个字符")
    private String title;

    /**
     * 投诉分类编码（可选）
     */
    private String categoryCode;

    /**
     * 投诉状态：0-待处理，1-处理中，2-已解决，3-已关闭（可选）
     */
    @Min(value = 0, message = "投诉状态值无效")
    @Max(value = 3, message = "投诉状态值无效")
    private Integer status;

    /**
     * 紧急程度：1-低，2-中，3-高，4-紧急（可选）
     */
    @Min(value = 1, message = "紧急程度值无效")
    @Max(value = 4, message = "紧急程度值无效")
    private Integer urgency;

    /**
     * 处理人ID（可选）
     */
    private Long handlerId;

    /**
     * 是否匿名投诉（可选）
     */
    private Boolean isAnonymous;

    /**
     * 满意度评分：1-5分（可选）
     */
    @Min(value = 1, message = "满意度评分不能小于1")
    @Max(value = 5, message = "满意度评分不能大于5")
    private Integer satisfactionRate;

    /**
     * 开始时间（可选）
     */
    private LocalDateTime startTime;

    /**
     * 结束时间（可选）
     */
    private LocalDateTime endTime;

    /**
     * 排序字段（可选）
     */
    private String sortField;

    /**
     * 排序方向：asc-升序，desc-降序（可选）
     */
    private String sortOrder;

    /**
     * 验证查询参数是否有效
     * 
     * @return 是否有效
     */
    public boolean isValid() {
        // 查询DTO不需要严格验证，只要基本格式正确即可
        
        // 验证时间范围
        if (startTime != null && endTime != null && startTime.isAfter(endTime)) {
            return false;
        }
        
        // 验证状态值
        if (status != null && !SystemStatusEnum.getByCode(status).equals(status)) {
            return false;
        }
        
        // 验证紧急程度
        if (urgency != null && (urgency < 1 || urgency > 4)) {
            return false;
        }
        
        // 验证满意度评分
        if (satisfactionRate != null && (satisfactionRate < 1 || satisfactionRate > 5)) {
            return false;
        }
        
        return true;
    }

    /**
     * 获取排序字段（带默认值）
     * 
     * @return 排序字段
     */
    public String getSortField() {
        return sortField != null ? sortField : "create_time";
    }

    /**
     * 获取排序方向（带默认值）
     * 
     * @return 排序方向
     */
    public String getSortOrder() {
        return sortOrder != null ? sortOrder : "desc";
    }

    /**
     * 获取状态名称
     * 
     * @return 状态名称
     */
    public String getStatusName() {
        if (status == null) return null;
        
        switch (status) {
            case 0: return "待处理";
            case 1: return "处理中";
            case 2: return "已解决";
            case 3: return "已关闭";
            default: return "未知";
        }
    }

    /**
     * 获取紧急程度名称
     * 
     * @return 紧急程度名称
     */
    public String getUrgencyName() {
        if (urgency == null) return null;
        
        switch (urgency) {
            case 1: return "低";
            case 2: return "中";
            case 3: return "高";
            case 4: return "紧急";
            default: return "未知";
        }
    }
}
